#include <iostream>

using namespace std;


//那其实这种做法就是只要这层循环内找不到， 那就是往下有个兜底的，过去属于侥幸了
//首先是开两个数组用来存储上一行和这个一行的一半的元素
long long int a[100010], b[100010];

long long find(long long n) {
    if (n == 1) {
        cout << 1 << endl;
        return 0;
    }
    a[0] = 1;
    b[0] = 1;
    //要在第三行开始的，那这个地方循环到44725是一个最大数了，自己找个数试试，在官网上用50000反正是也行
    for (int i = 3; i <= 44723; ++i) {
        //取一半的数
        int m = i / 2;
        for (int j = 1; j <= m; ++j) {
            //判断这一行的这个是否是奇数，如果是奇数，那么中位数肯定是上一行前面数字的两倍
            if (j == m && (i & 1) == 1) {
                b[j] = a[j - 1] * 2;
            } else {
                b[j] = a[j - 1] + a[j];
            }
            // 同步更新a数组，因为a数组是上一行，要把它更新为下一行的
            // 这里之所以不用a[j] = b[j]的原因是你如果现在把a中索引为j的元素更新了的话， 下一次循环还是要用到上一行a中原始的j下标的元素，那样就影响当前行
            a[j - 1] = b[j - 1];
            //在这里判断是不是n
            if (b[j] == n) {
                cout << i * (i - 1) / 2 + j + 1;
                return 0;
            }
        }
        //在这里把a中最后一个m下标的元素给更新了
        a[m] = b[m];
    }

    //能走到这说明上面的循环里压根没找到，就用这个来兜底
    cout << n * (n + 1) / 2 + 2;
}


//以下就是比较万无一失的方法了， 重头戏在于练分治
long long N;

long long C(int a, int b)//求第i行第j列的值
{
    // 那这个地方解释一下，以下的方式可以从所在的这一行中一直循环直到不满足条件，那循环过程中的res是递增的
    // 并且每次的res分别是这一行的下一个数， 那为什么要res > N 呢？
    // 就是说如果 还没循环到这个位置的数都大于N了，那再往后肯定还是大于N因为是递增的嘛，那就没有必要再找下去了省点时间
    long long res = 1;
    for (long long i = a, j = 1; j <= b; i--, j++) {
        res = res * i / j;
        if (res > N)//如果中间结果超过N就直接返回
            return res;
    }
    return res;
}

int main() {
    cin >> N;

    // 题目中的N要求大于等于1， 小于等于10的9次方

    // 注意这里最开始是第0行
    // 那这个地方为什么要从16列往后呢， 因为你会发现在第n行最大数就是它的中位数， 也就是排列组合的组合，（n/2，n）， 组合不太好写，就这样表示了
    // 你可以通过程序枚举或者excel发现（8，16）是第一个大于10的19次方的组合
    // 那为什么要从16往后而不是0往16呢， 因为是递增的嘛，行和列都是递增，如果能在尽量往后列中找到，那在前面列中找到的肯定不是第一次出现
    for (int i = 16; i >= 0; --i) {
        long long l = 2 * i, r = max(N, l), mid;
        while (l <= r) {
            mid = l + (r - l) / 2;
            if (C(mid, i) == N) {
                break;
            } else if (C(mid, i) > N) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        if (C(mid, i) == N) {
            cout << mid * (mid + 1) / 2 + i + 1 << endl;
            break;
        }
    }
    return 0;
}
